home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / Super_Anti2188999232010.psc / super anttivirus source code v3 / clsHuffman.cls < prev   
Text File  |  2010-09-14  |  16KB  |  439 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "clsHuffman"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Option Explicit
  15.  
  16. ' Huffman Compression Algorithm
  17. ' David Midkiff (mdj2023@hotmail.com>
  18.  
  19. Private Const PROGRESS_CALCFREQUENCY = 7
  20. Private Const PROGRESS_CALCCRC = 5
  21. Private Const PROGRESS_ENCODING = 88
  22. Private Const PROGRESS_DECODING = 89
  23. Private Const PROGRESS_CHECKCRC = 11
  24.  
  25. Event Progress(Procent As Integer)
  26.  
  27. Private Type HUFFMANTREE
  28.   ParentNode As Integer
  29.   RightNode As Integer
  30.   LeftNode As Integer
  31.   value As Integer
  32.   Weight As Long
  33. End Type
  34.  
  35. Private Type ByteArray
  36.   count As Byte
  37.   data() As Byte
  38. End Type
  39.  
  40. Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
  41.  
  42. Public Function EncodeFile(SourceFile As String, DestFile As String) As Boolean
  43.     Dim ByteArray() As Byte, Filenr As Integer
  44.     
  45.     If (Not FileExist(SourceFile)) Or (FileLen(SourceFile) = "0") Then
  46.         EncodeFile = False
  47.         Exit Function
  48.     End If
  49.     
  50.     Filenr = FreeFile
  51.     Open SourceFile For Binary As #Filenr
  52.         ReDim ByteArray(0 To LOF(Filenr) - 1)
  53.         Get #Filenr, , ByteArray()
  54.     Close #Filenr
  55.     
  56.     Call EncodeByte(ByteArray(), UBound(ByteArray) + 1)
  57.     
  58.     If (FileExist(DestFile)) Then Kill DestFile
  59.     
  60.     Open DestFile For Binary As #Filenr
  61.         Put #Filenr, , ByteArray()
  62.     Close #Filenr
  63.     EncodeFile = True
  64. End Function
  65. Public Function DecodeFile(SourceFile As String, DestFile As String) As Boolean
  66.     Dim ByteArray() As Byte, Filenr As Integer
  67.     
  68.     If (Not FileExist(SourceFile)) Or (FileLen(SourceFile) = "0") Then
  69.         DecodeFile = False
  70.         Exit Function
  71.     End If
  72.     
  73.     Filenr = FreeFile
  74.     Open SourceFile For Binary As #Filenr
  75.         ReDim ByteArray(0 To LOF(Filenr) - 1)
  76.         Get #Filenr, , ByteArray()
  77.     Close #Filenr
  78.     
  79.     Call DecodeByte(ByteArray(), UBound(ByteArray) + 1)
  80.     
  81.     If (FileExist(DestFile)) Then Kill DestFile
  82.     
  83.     Open DestFile For Binary As #Filenr
  84.         Put #Filenr, , ByteArray()
  85.     Close #Filenr
  86.     DecodeFile = True
  87. End Function
  88. Private Sub CreateTree(Nodes() As HUFFMANTREE, NodesCount As Long, Char As Long, Bytes As ByteArray)
  89.     Dim A As Integer, NodeIndex As Long
  90.     
  91.     NodeIndex = 0
  92.     For A = 0 To (Bytes.count - 1)
  93.         If (Bytes.data(A) = 0) Then
  94.             If (Nodes(NodeIndex).LeftNode = -1) Then
  95.                 Nodes(NodeIndex).LeftNode = NodesCount
  96.                 Nodes(NodesCount).ParentNode = NodeIndex
  97.                 Nodes(NodesCount).LeftNode = -1
  98.                 Nodes(NodesCount).RightNode = -1
  99.                 Nodes(NodesCount).value = -1
  100.                 NodesCount = NodesCount + 1
  101.             End If
  102.             NodeIndex = Nodes(NodeIndex).LeftNode
  103.         ElseIf (Bytes.data(A) = 1) Then
  104.             If (Nodes(NodeIndex).RightNode = -1) Then
  105.                 Nodes(NodeIndex).RightNode = NodesCount
  106.                 Nodes(NodesCount).ParentNode = NodeIndex
  107.                 Nodes(NodesCount).LeftNode = -1
  108.                 Nodes(NodesCount).RightNode = -1
  109.                 Nodes(NodesCount).value = -1
  110.                 NodesCount = NodesCount + 1
  111.             End If
  112.             NodeIndex = Nodes(NodeIndex).RightNode
  113.         Else
  114.             Stop
  115.         End If
  116.     Next
  117.     Nodes(NodeIndex).value = Char
  118. End Sub
  119. Public Sub EncodeByte(ByteArray() As Byte, ByteLen As Long)
  120.     Dim I As Long, j As Long, Char As Byte, BitPos As Byte, lNode1 As Long
  121.     Dim lNode2 As Long, lNodes As Long, lLength As Long, count As Integer
  122.     Dim lWeight1 As Long, lWeight2 As Long, Result() As Byte, ByteValue As Byte
  123.     Dim ResultLen As Long, Bytes As ByteArray, NodesCount As Integer, NewProgress As Integer
  124.     Dim CurrProgress As Integer, BitValue(0 To 7) As Byte, CharCount(0 To 255) As Long
  125.     Dim Nodes(0 To 511) As HUFFMANTREE, CharValue(0 To 255) As ByteArray
  126.   
  127.     If (ByteLen = 0) Then
  128.         ReDim Preserve ByteArray(0 To ByteLen + 3)
  129.         If (ByteLen > 0) Then Call CopyMem(ByteArray(4), ByteArray(0), ByteLen)
  130.         ByteArray(0) = 72
  131.         ByteArray(1) = 69
  132.         ByteArray(2) = 48
  133.         ByteArray(3) = 13
  134.         Exit Sub
  135.     End If
  136.   
  137.     ReDim Result(0 To 522)
  138.     Result(0) = 72
  139.     Result(1) = 69
  140.     Result(2) = 51
  141.     Result(3) = 13
  142.     ResultLen = 4
  143.   
  144.     For I = 0 To (ByteLen - 1)
  145.         CharCount(ByteArray(I)) = CharCount(ByteArray(I)) + 1
  146.         If (I Mod 1000 = 0) Then
  147.             NewProgress = I / ByteLen * PROGRESS_CALCFREQUENCY
  148.             If (NewProgress <> CurrProgress) Then
  149.                 CurrProgress = NewProgress
  150.                 RaiseEvent Progress(CurrProgress)
  151.             End If
  152.         End If
  153.     Next
  154.     For I = 0 To 255
  155.         If (CharCount(I) > 0) Then
  156.             With Nodes(NodesCount)
  157.                 .Weight = CharCount(I)
  158.                 .value = I
  159.                 .LeftNode = -1
  160.                 .RightNode = -1
  161.                 .ParentNode = -1
  162.             End With
  163.             NodesCount = NodesCount + 1
  164.         End If
  165.     Next
  166.   
  167.     For lNodes = NodesCount To 2 Step -1
  168.         lNode1 = -1: lNode2 = -1
  169.         For I = 0 To (NodesCount - 1)
  170.             If (Nodes(I).ParentNode = -1) Then
  171.                 If (lNode1 = -1) Then
  172.                     lWeight1 = Nodes(I).Weight
  173.                     lNode1 = I
  174.                 ElseIf (lNode2 = -1) Then
  175.                     lWeight2 = Nodes(I).Weight
  176.                     lNode2 = I
  177.                 ElseIf (Nodes(I).Weight < lWeight1) Then
  178.                     If (Nodes(I).Weight < lWeight2) Then
  179.                         If (lWeight1 < lWeight2) Then
  180.                             lWeight2 = Nodes(I).Weight
  181.                             lNode2 = I
  182.                         Else
  183.                             lWeight1 = Nodes(I).Weight
  184.                             lNode1 = I
  185.                         End If
  186.                     Else
  187.                         lWeight1 = Nodes(I).Weight
  188.                         lNode1 = I
  189.                     End If
  190.                 ElseIf (Nodes(I).Weight < lWeight2) Then
  191.                     lWeight2 = Nodes(I).Weight
  192.                     lNode2 = I
  193.                 End If
  194.             End If
  195.         Next
  196.     
  197.         With Nodes(NodesCount)
  198.             .Weight = lWeight1 + lWeight2
  199.             .LeftNode = lNode1
  200.             .RightNode = lNode2
  201.             .ParentNode = -1
  202.             .value = -1
  203.         End With
  204.     
  205.         Nodes(lNode1).ParentNode = NodesCount
  206.         Nodes(lNode2).ParentNode = NodesCount
  207.         NodesCount = NodesCount + 1
  208.     Next
  209.  
  210.     ReDim Bytes.data(0 To 255)
  211.     Call CreateBitSequences(Nodes(), NodesCount - 1, Bytes, CharValue)
  212.   
  213.     For I = 0 To 255
  214.         If (CharCount(I) > 0) Then lLength = lLength + CharValue(I).count * CharCount(I)
  215.     Next
  216.     lLength = IIf(lLength Mod 8 = 0, lLength \ 8, lLength \ 8 + 1)
  217.   
  218.     If ((lLength = 0) Or (lLength > ByteLen)) Then
  219.         ReDim Preserve ByteArray(0 To ByteLen + 3)
  220.         Call CopyMem(ByteArray(4), ByteArray(0), ByteLen)
  221.         ByteArray(0) = 72
  222.         ByteArray(1) = 69
  223.         ByteArray(2) = 48
  224.         ByteArray(3) = 13
  225.         Exit Sub
  226.     End If
  227.   
  228.     Char = 0
  229.     For I = 0 To (ByteLen - 1)
  230.         Char = Char Xor ByteArray(I)
  231.         If (I Mod 10000 = 0) Then
  232.             NewProgress = I / ByteLen * PROGRESS_CALCCRC + PROGRESS_CALCFREQUENCY
  233.             If (NewProgress <> CurrProgress) Then
  234.                 CurrProgress = NewProgress
  235.                 RaiseEvent Progress(CurrProgress)
  236.             End If
  237.         End If
  238.     Next
  239.     Result(ResultLen) = Char
  240.     ResultLen = ResultLen + 1
  241.     Call CopyMem(Result(ResultLen), ByteLen, 4)
  242.     ResultLen = ResultLen + 4
  243.     BitValue(0) = 2 ^ 0
  244.     BitValue(1) = 2 ^ 1
  245.     BitValue(2) = 2 ^ 2
  246.     BitValue(3) = 2 ^ 3
  247.     BitValue(4) = 2 ^ 4
  248.     BitValue(5) = 2 ^ 5
  249.     BitValue(6) = 2 ^ 6
  250.     BitValue(7) = 2 ^ 7
  251.     count = 0
  252.     For I = 0 To 255
  253.         If (CharValue(I).count > 0) Then count = count + 1
  254.     Next
  255.     Call CopyMem(Result(ResultLen), count, 2)
  256.     ResultLen = ResultLen + 2
  257.     count = 0
  258.     For I = 0 To 255
  259.         If (CharValue(I).count > 0) Then
  260.             Result(ResultLen) = I
  261.             ResultLen = ResultLen + 1
  262.             Result(ResultLen) = CharValue(I).count
  263.             ResultLen = ResultLen + 1
  264.             count = count + 16 + CharValue(I).count
  265.         End If
  266.     Next
  267.   
  268.     ReDim Preserve Result(0 To ResultLen + count \ 8)
  269.   
  270.     BitPos = 0
  271.     ByteValue = 0
  272.     For I = 0 To 255
  273.         With CharValue(I)
  274.             If (.count > 0) Then
  275.                 For j = 0 To (.count - 1)
  276.                     If (.data(j)) Then ByteValue = ByteValue + BitValue(BitPos)
  277.                     BitPos = BitPos + 1
  278.                     If (BitPos = 8) Then
  279.                         Result(ResultLen) = ByteValue
  280.                         ResultLen = ResultLen + 1
  281.                         ByteValue = 0
  282.                         BitPos = 0
  283.                     End If
  284.                 Next
  285.             End If
  286.         End With
  287.     Next
  288.     If (BitPos > 0) Then
  289.         Result(ResultLen) = ByteValue
  290.         ResultLen = ResultLen + 1
  291.     End If
  292.   
  293.     ReDim Preserve Result(0 To ResultLen - 1 + lLength)
  294.   
  295.     Char = 0
  296.     BitPos = 0
  297.     For I = 0 To (ByteLen - 1)
  298.         With CharValue(ByteArray(I))
  299.             For j = 0 To (.count - 1)
  300.                 If (.data(j) = 1) Then Char = Char + BitValue(BitPos)
  301.                 BitPos = BitPos + 1
  302.                 If (BitPos = 8) Then
  303.                     Result(ResultLen) = Char
  304.                     ResultLen = ResultLen + 1
  305.                     BitPos = 0
  306.                     Char = 0
  307.                 End If
  308.             Next
  309.         End With
  310.         If (I Mod 10000 = 0) Then
  311.             NewProgress = I / ByteLen * PROGRESS_ENCODING + PROGRESS_CALCCRC + PROGRESS_CALCFREQUENCY
  312.             If (NewProgress <> CurrProgress) Then
  313.                 CurrProgress = NewProgress
  314.                 RaiseEvent Progress(CurrProgress)
  315.             End If
  316.         End If
  317.     Next
  318.  
  319.     If (BitPos > 0) Then
  320.         Result(ResultLen) = Char
  321.         ResultLen = ResultLen + 1
  322.     End If
  323.     ReDim ByteArray(0 To ResultLen - 1)
  324.     Call CopyMem(ByteArray(0), Result(0), ResultLen)
  325.     If (CurrProgress <> 100) Then RaiseEvent Progress(100)
  326. End Sub
  327. Public Function DecodeString(Text As String) As String
  328.     Dim ByteArray() As Byte
  329.     ByteArray() = StrConv(Text, vbFromUnicode)
  330.     Call DecodeByte(ByteArray, Len(Text))
  331.     DecodeString = StrConv(ByteArray(), vbUnicode)
  332. End Function
  333. Public Function EncodeString(Text As String) As String
  334.     Dim ByteArray() As Byte
  335.     ByteArray() = StrConv(Text, vbFromUnicode)
  336.     Call EncodeByte(ByteArray, Len(Text))
  337.     EncodeString = StrConv(ByteArray(), vbUnicode)
  338. End Function
  339. Public Sub DecodeByte(ByteArray() As Byte, ByteLen As Long)
  340.     Dim I As Long, j As Long, pos As Long, Char As Byte, CurrPos As Long
  341.     Dim count As Integer, CheckSum As Byte, Result() As Byte, BitPos As Integer
  342.     Dim NodeIndex As Long, ByteValue As Byte, ResultLen As Long, NodesCount As Long
  343.     Dim lResultLen As Long, NewProgress As Integer, CurrProgress As Integer, BitValue(0 To 7) As Byte
  344.     Dim Nodes(0 To 511) As HUFFMANTREE, CharValue(0 To 255) As ByteArray
  345.       
  346.     If (ByteArray(0) <> 72) Or (ByteArray(1) <> 69) Or (ByteArray(3) <> 13) Then
  347.     ElseIf (ByteArray(2) = 48) Then
  348.         Call CopyMem(ByteArray(0), ByteArray(4), ByteLen - 4)
  349.         ReDim Preserve ByteArray(0 To ByteLen - 5)
  350.         Exit Sub
  351.     ElseIf (ByteArray(2) <> 51) Then
  352.         Err.Raise vbObjectError, "HuffmanDecode()", "The data either was not compressed with HE3 or is corrupt (identification string not found)"
  353.         Exit Sub
  354.     End If
  355.       
  356.     CurrPos = 5
  357.     CheckSum = ByteArray(CurrPos - 1)
  358.     CurrPos = CurrPos + 1
  359.       
  360.     Call CopyMem(ResultLen, ByteArray(CurrPos - 1), 4)
  361.     CurrPos = CurrPos + 4
  362.     lResultLen = ResultLen
  363.     If (ResultLen = 0) Then Exit Sub
  364.     ReDim Result(0 To ResultLen - 1)
  365.     Call CopyMem(count, ByteArray(CurrPos - 1), 2)
  366.     CurrPos = CurrPos + 2
  367.     
  368.     For I = 1 To     CurrPos = Co + lWeight2
  369.             .Lhen
  370.     Next
  371.     l Next
  372.    (ReseArray(CurrPoserrPos = CurrByte
  373.     Di7p)o1rray(Cur0     wText))
  374.     Enco), 4)
  375.     
  376.    E    End If
  377.       
  378.  
  379.     
  380.    EwTex0n
  381.       
  382.  
  383.     os + 4
  384.     lReurrP Enco),     os + 4
  385.     lReurrP Enco),     os + 4
  386.     lReurrP Enco),     os + 4
  387.     lReurrP Enco),     os + 4
  388.     lReurrP Enco),     os + 4
  389.     lReurrP Enco),     os + 4
  390.     lReurrP Enco),     os + 4
  391.     lReurrP sC l>(lNode2 =D  lReurrP Enco),     os + 4
  392.     lReurrP Enco),     os + 4
  393.     lReurrP sC l>(lNode2 =D  lReurrP Enco),     os + 4
  394.     lReurrP Enco),     os + 4
  395.     lReurrP sC l>(lNode2 =D  lReurrP Enco),     os + 4
  396.     eurrP Enco),     os + 4TInteg) + 1
  397.         If (I ModteArray(0), Bytr isos +rex As Long
  398.          b ,     os + 4
  399.     lReurrP Enco),     os + 
  400.   on0t       Resulenteg) + 1
  401.         If (I ModteArr,P End IfLong, Char As Byte, CurrPos Ass,dteArr,P End IfLong, Char As Byte, CurrPos Ass,dteArr,P End IfLong, Charr0     wText))
  402.   fLong, CharbA8cr,P End If,P End IfLong, Char e=0+RFor j = 0 To (   If (Nodes(ISrex AsedpEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd IfEnd 
  403.   bpR@R=D  lReurrP Eh0 bpR@R=D  e+ 4
  404.     BitValue(0) = 2 IfEndt1 < lWeighLong, Ch      leb"d IfEnd IfEnd l Nexta(IfEnd IfEnd l NexNodes + 4
  405.    
  406.    sC l>(lN2) = 48)   
  407.    sCogress(Cund IfffffnpnAt* IfEnd IfE,)n(Text))
  408.     De(3) = )t* IfEnd IfE,)pdCund   BitValueeeteger, CurrPro( xb,)pdCund   BitValueeetegeray(1) <> 69) ODe6Sext
  409.     + BitValu IfEnyteArray(CurrPos - 1), 4)
  410.     CurrPos = CurrPos + 4
  411.     lResultLen = ResultLen
  412.     If (ResultLen = 0) Then Exit Sub
  413.     ReDim Result(0 To ResultLen - 1)
  414.     Call CopyMem(count, ByteArray(CurrPos - 1), 2)
  415.     CurrPosb,)pdCund  ))))))))))))))))rrPo8Pro( xb,)pdCund   BitValueeetegeray(1) <> 6900)
  416. End Se)
  417.   fLong = Char + BitValue(BitPhe data either was not compressed with HE3 or is corrupt Rr + 4
  418.     lReurrP EnLen    wText))sBytemBar  count + 16 lhount"CurrPos + 4s.tValue(BitPe lhogteArray(Curr wwwwwPos + 4s.tVa1teA
  419.    sCogreountnl1nt"CurrPos  If (CharCo(>(lN2) = greountncAss,dteArr,P E)IfE M             ,peIf (E M    8ls Ass M             lRtrConong,npDnt, ByteArray((((((((((End IfLong, Ch TSnr) - 1)
  420.         EonongetValuPro( xb,)pdCund   BeH HE3 or is corrupt RAAAAAAAAAAAAAAA
  421.    Da8r wwwwwPos ount > 0) Th   > 0) )lReurrP EnLen 6n
  422.       
  423.     CResultLen =0) Th   ( Long, lWeight2 As L+sult(0 To Rerr,P End I    
  424.     CRes 
  425.     CRes 
  426.   cesulm2-   sultLen =0) Th   ( Lo8(CharCo(>(lN2) = e CurrPos  IfurrPos  IfurrPos  Cos)
  427.  d IfffffnpnAt* IfEnd IfE,)n(Text))
  428.       RAAOen - 1)
  429.     Call CopyMem(count, t))
  430.       RAAOen - 1)(((((((Enpt found)"oROen - 1)(eFBnpt fpnAt* IfEnid IfEnd Inin)"oROen - 10I
  431.  d IfV)iR  Stop
  432.         End If
  433.     N        lR Di     lR Di   0) 
  434. 5ey.taiseEven N        nupt iseEven N  Na   End If
  435.     N  =all Cl=d IfE,)n(Text))
  436.       RAAOen - 1)
  437.     Call CopyMem(count, t))
  438.       RAAOen - 1Text)a)
  439.       RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt     RAt